package utils

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strings"
	"time"
)

// get请求
func HttpGet(url string) (string, error) {
	resp, err := http.Get(url)
	if err != nil {
		return "", err
	}
	defer resp.Body.Close()

	// 检查响应状态码
	if resp.StatusCode != http.StatusOK {
		return "", fmt.Errorf("服务端错误 (状态码 %d)", resp.StatusCode)
	}
	//读取内容
	content, err := io.ReadAll(resp.Body)
	if err != nil {
		return "", err
	}

	return string(content), err
}

// Post请求
func HttpPost(url string, param map[string]string) string {
	// 序列化
	data, err := json.Marshal(param)
	if err != nil {
		fmt.Println("转换失败", err)
		return ""
	}
	// json
	contentType := "application/json"
	resp, err := http.Post(url, contentType, bytes.NewBuffer(data))
	if err != nil {
		fmt.Println("post failed, err:", err)
		return ""
	}
	defer resp.Body.Close()
	b, err := io.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("get resp failed, err", err)
		return ""
	}
	return string(b)
}

// 获取当前工作目录
func GetCurrentPath() string {
	// 获取当前工作目录
	currentDir, errs := os.Getwd()
	if errs != nil {
		log.Fatal(errs)
	}
	return currentDir
}

// 获取最后一级目录名
func GetProjectNameFromPath(path string) string {
	// 标准化路径（处理不同操作系统的路径分隔符）
	cleanPath := filepath.Clean(path)

	// 获取最后一级目录名
	base := filepath.Base(cleanPath)

	// 去除可能的.git后缀（如果是Git仓库）
	if strings.HasSuffix(base, ".git") {
		base = strings.TrimSuffix(base, ".git")
	}

	return base
}

// colorize 为文本添加ANSI颜色代码
func Colorize(text, ansiCode string) string {
	return fmt.Sprintf("\033[%sm%s\033[0m", ansiCode, text)
}

// 加载动画
func LoadingAnimation(done chan bool) {
	frames := []string{"⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"}
	i := 0
	for {
		select {
		case <-done:
			// 当接收到done信号时，停止动画
			// fmt.Printf("\r%s\n", "Done!      ")
			fmt.Printf("\r%s", "")
			return
		default:
			// 默认情况下，继续显示动画
			fmt.Printf("\r%s", frames[i])
			i = (i + 1) % len(frames)
			time.Sleep(100 * time.Millisecond)
		}
	}
}

// ProgressBar 显示进度条
func ProgressBar(total int) {
	for i := 0; i <= total; i++ {
		fmt.Printf("\r[%-50s] %d%%", strings.Repeat("=", i/2), i)
		time.Sleep(100 * time.Millisecond)
	}
	fmt.Println()
}
